library(ggplot2)

ggplot(mpg, aes(displ, hwy)) +
  geom_point() +
  geom_smooth(method = "lm", formula = y ~ x) +
  theme_gray(paper = "cornsilk", ink = "navy", accent = "tomato")
# ink, paper, accent分别控制整张图的前景色、背景色和强调色

# 新增theme(geom)参数用于集中管理geoms的默认样式；
# 通过element_geom()函数可配置该参数中的属性；
# from_theme()函数允许在 aes()内部直接调用主题中定义的默认值。
ggplot(mpg, aes(class, displ)) +
  geom_boxplot(aes(color = from_theme(accent))) +
  theme(geom = element_geom(accent = "tomato", paper = "cornsilk"))

# element_geom()的另一个重要设计区别在于对“线”的用途区分
ggplot(faithful, aes(waiting)) +
  geom_histogram(bins = 30, color = "black") +
  geom_freqpoly(bins = 30) +
  theme(
    geom = element_geom(
      broadertype = "dashed",
      borderwidth = 0.2,
      linewidth = 2,
      linetype = "solid"
    )
  )


# 配色方案（palettes）现在也可通过theme统一管理。
# 相关主题设置遵循 palette.{美学属性}.{数据类型}的命名格式（如 palette.colour.continuous）
# 其中数据类型分为离散（discrete）与连续（continuous）。
# 这一改进使配色方案能够与主题的其他样式设置协同工作，实现整体视觉风格的一致性。
ggplot(mpg, aes(displ, hwy, shape = drv, color = cty)) +
  geom_point() +
  theme(
    palette.colour.continuous = c("chartreuse", "forestgreen"),
    palette.colour.discrete = c(
      "triangle",
      "triangle open",
      "triangle down open"
    )
  )

# 新增theme设置快捷函数，为提升主题代码的可读性和编写效率。
# 这些函数通过自动添加对应前缀，将参数传递至 theme()中，例如：
# theme_sub_axis()
# theme_sub_axis_x()
# theme_sub_axis_bottom()
# theme_sub_axis_top()
# theme_sub_axis_y()
# theme_sub_axis_left()
# theme_sub_axis_right()
# theme_sub_panel()
# theme_sub_plot()
# theme_sub_strip()

# theme间距与边距设置引入了spacing（间距）和 margins（边距）作为新的根元素
p <- ggplot(penguins, aes(bill_dep, bill_len, colour = species)) +
  geom_point(na.rm = TRUE)
p +
  theme(
    spacing = unit(1, "cm"), # spacing
    margins = margin_auto(1, unit = "cm"), # margins
    axis.ticks.length.x = rel(2)
  )

# 新增了通过 panel.widths和 panel.heights参数精确控制面板尺寸的功能，
# 与 ggsave(width, height)（控制整个图形输出尺寸）形成互补。
p1 <- p +
  facet_grid(~island) +
  labs(title = "Seperate units (per panel)") +
  # Using the new shortcut for panels
  theme_sub_panel(widths = unit(c(2, 3, 4), "cm"), heights = unit(3, "cm"))
p2 <- p +
  facet_grid(~island) +
  labs(title = "Single unit (all panels)") +
  theme_sub_panel(widths = unit(9, "cm"), heights = unit(3, "cm"))
p1
p2

